#include <iostream>
#include <thread>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include "Thread.hpp"
#include<vector>

using namespace std;
using namespace ThreadModle;

const int num=10;

void Print(int &cnt)
{
    while(cnt)
    {
        cout<<"i am a threda,cnt:"<<cnt--<<endl;
        sleep(1);
    }
}

int main()
{
    vector<Thread<int>> threads;
    //1.创建一批线程
    for(int i=0;i<num;i++)
    {
        string name="thread-"+to_string(i+1);
        threads.emplace_back(Print,10,name);//其作用是在 threads 容器的尾部直接构造一个 Thread<int> 对象
    }

    //2.启动一批线程
    for(auto thread:threads)
    {
        thread.Start();
    }

    //3.等待一批进程
    for(auto thread:threads)
    {
        thread.Join();
        cout<<"wait thread,thread is:"<<thread.Name()<<endl;
    }

    return 0;
}










// int g_val=100;


// //线程是可以分离的
// //如果我们的主线程不关心新线程的执行信息，我们就可以将新线程设置为分离状态
// //但是他们底层还是属于同一个进程，只不过不用等待了
// void *thread1(void *args)
// {
//     pthread_detach(pthread_self());//分离
//     string name = static_cast<const char *>(args);
//     while (true)
//     {
//         sleep(1);
//         printf("%s,&g_val:%p\n", name.c_str(), &g_val);
//     }

//     return nullptr;
// }

// void *thread2(void *args)
// {
//     sleep(5);
//     string name = static_cast<const char *>(args);
//     while (true)
//     {
//         sleep(1);
//         printf("%s,&g_val:%p\n", name.c_str(), &g_val);
//     }

//     return nullptr;
// }

// int main()
// {
//     pthread_t tid1;
//     pthread_t tid2;
//     pthread_create(&tid1, nullptr, thread1, (void *)"thread-1");
//     pthread_create(&tid2, nullptr, thread2, (void *)"thread-2");

//     //pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);
//     return 0;
// }

// c++
// void threadrun(int num)
// {
//     while (true)
//     {
//         cout << "i am a thread,num:" << num << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun, 1);
//     thread t2(threadrun, 2);
//     thread t3(threadrun, 3);
//     thread t4(threadrun, 4);
//     thread t5(threadrun, 5);

//     while (true)
//     {
//         cout << "i am a main thread" << endl;
//         sleep(1);
//     }

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();
//     t5.join();
//     return 0;
// }